using System;
using System.Collections.Generic;
using System.Linq;

namespace Rarous.NForms {
  /// <summary>
  /// Třída reprezentující výběr z několika možnoztí.
  /// </summary>
  public class RadioItem : FormItem {
    /// <summary>
    /// Konstruktor
    /// </summary>
    /// <param name="parent">Nadřazený formulář.</param>
    /// <param name="name">Název formulářového prvku.</param>
    /// <param name="label">Textový popisek.</param>
    /// <param name="items">Položky na výběr.</param>
    public RadioItem(Form parent, string name, string label, IEnumerable<ListItem> items)
      : this(parent, name, label, items, null) {
    }

    /// <summary>
    /// Konstruktor
    /// </summary>
    /// <param name="parent">Nadřazený formulář.</param>
    /// <param name="name">Název formulářového prvku.</param>
    /// <param name="label">Textový popisek.</param>
    /// <param name="items">Položky na výběr.</param>
    /// <param name="attributes">Atributy obalovacího elementu. Pokud je <c>null</c> nebude se renderovat.</param>
    public RadioItem(Form parent, string name, string label, IEnumerable<ListItem> items, object attributes) {
      ConstructorContract(parent, name, items);

      Control = attributes == null ? new HtmlElement(String.Empty) : new HtmlElement("div");
      Label = String.IsNullOrEmpty(label) ? new HtmlElement(String.Empty) : new HtmlElement(LabelTag, new { Text = label });

      Register(parent, name);
      SetAttributes(attributes);

      int i = 0;
      foreach (ListItem item in items) {
        Control.
          AddChild(InputTag, new { Name = name, Id = ConvertNameToId(name) + i, Type = InputType.Radio, Value = item.Value }, HtmlElement.SelfClosing).
          AddChild(LabelTag, new { For = ConvertNameToId(name) + i, Text = item.Text }).
          AddChild("br");
        i++;
      }
    }

    /// <summary>
    /// Nastaví vybravou položku.
    /// </summary>
    /// <param name="value">Hodnota vybrané položky.</param>
    /// <returns></returns>
    public override FormItem SetValue(object value) {
      foreach (HtmlElement element in this.Control) {
        if (element.Attributes.ContainsKey("Value") && element["Value"].Equals(value.ToString())) {
          element["Selected"] = "selected";
        }
      }
      return this;
    }
    
    private static void ConstructorContract(Form parent, string name, IEnumerable<ListItem> items) {
      ConstructorContract(parent, name);
      if (items == null) {
        throw new ArgumentNullException("items");
      }
    }
  }
}
